<!DOCTYPE html>
<html>
<head>
<script src="../../../resources/js-test.js"></script>
<script src="../resources/common.js"></script>
</head>
<body>
<p id="description"></p>
<div id="console"></div>

<script>
description("Tests bad inputs to ECDH's deriveBits()");

jsTestIsAsync = true;

var keyPairs = {
    ecdh: {},
    ecdsa: {}
};

// Generate some EC keys for ECDSA and ECDH.
function createTestKeys() {
    return crypto.subtle.generateKey({name: "ecdh", namedCurve: "P-256"}, true, ["deriveBits"]).then(function(result) {
      keyPairs.ecdh.p256_1 = result;

      return crypto.subtle.generateKey({name: "ecdh", namedCurve: "P-256"}, true, ["deriveBits"]);
    }).then(function(result) {
      keyPairs.ecdh.p256_2 = result;

      return crypto.subtle.generateKey({name: "ecdh", namedCurve: "P-384"}, true, ["deriveBits"]);
    }).then(function(result) {
      keyPairs.ecdh.p384_1 = result;

      return crypto.subtle.generateKey({name: "ecdsa", namedCurve: "P-256"}, true, ["sign"]);
    }).then(function(result) {
      keyPairs.ecdsa.p256_1 = result;
    });
}

createTestKeys().then(function(result) {
  debug("\nderiveBits() without algorithm name or public key...");
  return crypto.subtle.deriveBits({}, keyPairs.ecdh.p256_1.privateKey, 256);
}).then(failAndFinishJSTest, function(result) {
  logError(result);

  debug("\nderiveBits() without public key...");
  return crypto.subtle.deriveBits({name: 'ecdh'}, keyPairs.ecdh.p256_1.privateKey, 256);
}).then(failAndFinishJSTest, function(result) {
  logError(result);

  debug("\nderiveBits() with algorithm that is null...");
  return crypto.subtle.deriveBits(null, keyPairs.ecdh.p256_1.privateKey, 256);
}).then(failAndFinishJSTest, function(result) {
  logError(result);

  debug("\nderiveBits() with algorithm that is -1...");
  return crypto.subtle.deriveBits(-1, keyPairs.ecdh.p256_1.privateKey, 256);
}).then(failAndFinishJSTest, function(result) {
  logError(result);

  debug("\nderiveBits() with public key that is null...");
  return crypto.subtle.deriveBits({name: 'ecdh', public: null}, keyPairs.ecdh.p256_1.privateKey, 256);
}).then(failAndFinishJSTest, function(result) {
  logError(result);

  debug("\nderiveBits() with public key that is -1...");
  return crypto.subtle.deriveBits({name: 'ecdh', public: -1}, keyPairs.ecdh.p256_1.privateKey, 256);
}).then(failAndFinishJSTest, function(result) {
  logError(result);

  debug("\nderiveBits() with public key that is a string...");
  return crypto.subtle.deriveBits({name: 'ecdh', public: "foo"}, keyPairs.ecdh.p256_1.privateKey, 256);
}).then(failAndFinishJSTest, function(result) {
  logError(result);

  debug("\nderiveBits() with wrong curve public key...");
  return crypto.subtle.deriveBits({name: 'ecdh', public: keyPairs.ecdh.p384_1.publicKey}, keyPairs.ecdh.p256_1.privateKey, 256);
}).then(failAndFinishJSTest, function(result) {
  logError(result);

  debug("\nderiveBits() with a private key as the 'public' parameter");
  return crypto.subtle.deriveBits({name: 'ecdh', public: keyPairs.ecdh.p256_2.privateKey}, keyPairs.ecdh.p256_1.privateKey, 256);
}).then(failAndFinishJSTest, function(result) {
  logError(result);

  debug("\nderiveBits() with public key that is for ECDSA...");
  return crypto.subtle.deriveBits({name: 'ecdh', public: keyPairs.ecdsa.p256_1.publicKey}, keyPairs.ecdh.p256_1.privateKey, {test: 3});
}).then(failAndFinishJSTest, function(result) {
  logError(result);
}).then(finishJSTest, failAndFinishJSTest);

</script>

</body>
</html>
